package com.linw.springboot;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>@Author Kam</p>
 * <p>@Date 2018/6/7</p>
 * <p>@Version</p>
 */
public class ExecuteCodecs {

	private static final Logger logger = LoggerFactory.getLogger("ExecuteCodecs");

	/**
	 * 视频转码 (PC端转MP4)
	 * @param ffmpegPath    转码工具的存放路径
	 * @param inputFilePath    用于指定要转换格式的文件,要截图的视频源文件
	 * @param outputFilePath    格式转换后的的文件保存路径
	 * @return
	 * @throws Exception
	 */
	public static boolean exchangeToMp4(String ffmpegPath, String inputFilePath, String outputFilePath) throws Exception {
		int index = outputFilePath.lastIndexOf("/");
		File outputFile     = new File(outputFilePath.substring(0,index));
		if(!outputFile.exists()){
			outputFile.mkdirs();
		}

		// 创建List集合来保存转换视频文件为mp4格式的命令
		List<String> convert = new ArrayList<String>();
		convert.add(ffmpegPath); // 添加转换工具ffmpeg.exe路径
		convert.add("-y"); // 该参数指定将覆盖已存在的文件
		convert.add("-r");
		convert.add("10");
		convert.add("-i");
		convert.add(inputFilePath);
		convert.add("-vcodec");
		convert.add("h264");
		convert.add("-f");
		convert.add("mp4");
		convert.add(outputFilePath);

		boolean mark = true;

		try {
			Process videoProcess = new ProcessBuilder(convert).redirectErrorStream(true).start();
			new PrintStream(videoProcess.getInputStream()).run();
			videoProcess.waitFor();  // 加上这句，系统会等待转换完成。不加，就会在服务器后台自行转换。
		} catch (Exception e) {
			mark = false;
			logger.info("转码失败:输出地址{}, 输出地址:{}", inputFilePath, outputFilePath);
		}
		return mark;
	}
	
	
	/**
	 * 锐明APK视频转码 (PC端转MP4)
	 * @param ffmpegPath    转码工具的存放路径
	 * @param inputFilePath    用于指定要转换格式的文件,要截图的视频源文件
	 * @param outputFilePath    格式转换后的的文件保存路径
	 * @return
	 * @throws Exception
	 */
	public static boolean exchangeToMp4RuiMing(String ffmpegPath, String inputFilePath, String outputFilePath) throws Exception {
		int index = outputFilePath.lastIndexOf("/");
		File outputFile     = new File(outputFilePath.substring(0,index));
		if(!outputFile.exists()){
			outputFile.mkdirs();
		}

		// 创建List集合来保存转换视频文件为mp4格式的命令
		List<String> convert = new ArrayList<String>();
		convert.add(ffmpegPath); // 添加转换工具ffmpeg.exe路径
		convert.add(inputFilePath);
		convert.add(outputFilePath);

		boolean mark = true;

		try {
			Process videoProcess = new ProcessBuilder(convert).redirectErrorStream(true).start();
			new PrintStream(videoProcess.getInputStream()).run();
			videoProcess.waitFor();  // 加上这句，系统会等待转换完成。不加，就会在服务器后台自行转换。
		} catch (Exception e) {
			mark = false;
			logger.info("转码失败:输出地址{}, 输出地址:{}", inputFilePath, outputFilePath);
		}
		return mark;
	}
	
	public static void main(String[] args){
		try {
//			ExecuteCodecs.exchangeToMp4RuiMing("E:/264-to-mp4/ToMp4.exe", "E:/02_12_6402_0_0e0636a9367748d0a283a4e273472ce2.h264", "E:/13.mp4");
			ExecuteCodecs.exchangeToMp4("C:\\Users\\Administrator\\Desktop\\fsdownload\\ffmpeg", "D:\\soft\\finalshell\\temp\\edit\\三亚_321905290016_0_100_20201112142132.mp4", "E:/4.mp4");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}
